android canvas画布重绘? 您所在的位置:网站首页 canvas 安卓 android canvas画布重绘?

android canvas画布重绘?

2023-04-21 12:45| 来源: 网络整理| 查看: 265

自己定义控件时经常遇到重写View的draw()方法,draw()方法经常设计到save()和restore()这两个方法.这两个相互匹配出现的,作用是用来保存画布的状态和取出保存的状态的。

save():用来保存canvas的状态,save()方法之后的代码,能够调用canvas的平移、放缩、旋转、裁剪等操作!restore():用来恢复canvas之前保存的状态,防止save()方法代码之后对canvas运行的操作。继续对兴许的绘制会产生影响。通过该方法能够避免连带的影响!

public class MyView extends View { public MyView(Context context) { super(context); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.drawColor(Color.GREEN); //canvas变换操作不会对前面造成影响 canvas.clipRect(new Rect(100, 200, 500, 500)); canvas.drawColor(Color.BLUE); } } 复制代码canvas.drawColor(Color.GREEN); //canvas变换操作不会对前面造成影响 canvas.clipRect(new Rect(100, 200, 500, 500)); canvas.drawColor(Color.BLUE); Paint paint = new Paint(); paint.setColor(Color.RED); canvas.drawCircle(200,200,500,paint); 复制代码我们发现canvas裁剪产生的画布,绘制,不会对非裁剪的区域造成影响。canvas.drawColor(Color.GREEN); //保存画布当前的状态(保存到画布栈里面了) canvas.save(); //canvas变换操作不会对前面造成影响 canvas.clipRect(new Rect(100, 100, 500, 500)); canvas.drawColor(Color.BLUE); //恢复画布 canvas.restore(); Paint paint = new Paint(); paint.setColor(Color.RED); canvas.drawCircle(100, 100, 100, paint); 复制代码canvas.drawColor(Color.GREEN); //保存画布当前的状态 canvas.save(); //canvas变换操作不会对前面造成影响 canvas.clipRect(new Rect(100, 100, 500, 500)); canvas.drawColor(Color.BLUE); canvas.save(); //恢复画布 //canvas.restore(); Paint paint = new Paint(); paint.setColor(Color.RED); canvas.drawCircle(100, 100, 100, paint); canvas.restore(); paint.setColor(Color.YELLOW); canvas.drawCircle(150,150,100,paint); 复制代码结论:画板是以栈的形式进行存储搜索动画实际案例public abstract class BaseController { public static final int STATE_ANIM_NONE = 0; public static final int STATE_ANIM_START = 1; public static final int STATE_ANIM_STOP = 2; public static final int DEFAULT_ANIM_TIME = 5000; public static final float DEFAULT_ANIM_STARTF = 0; public static final float DEFAULT_ANIM_ENDF = 1; private MySearchView mySearchView; public int mState = STATE_ANIM_NONE; public abstract void draw(Canvas canvas,Paint paint); public void startAnim(){ } public void resetAnim(){ } public int getWidth(){ return mySearchView.getWidth(); } public int getHeight(){ return mySearchView.getHeight(); } public void setSearchView(MySearchView mySearchView){ this.mySearchView = mySearchView; } public float mpro = -1; public ValueAnimator startViewAnimation(){ ValueAnimator valueAnimator = ValueAnimator.ofFloat(0,1); valueAnimator.setDuration(800L); valueAnimator.setInterpolator(new LinearInterpolator()); valueAnimator.addUpdateListener(new AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { mpro = (float) animation.getAnimatedValue(); mySearchView.invalidate(); } }); valueAnimator.start(); mpro = 0; return valueAnimator; } } 复制代码

绘制类

public class Controller1 extends BaseController { private String mColor = "#4CAF50"; private int cx, cy, cr; private RectF mRectF; private int j = 15; public Controller1() { mRectF = new RectF(); } @Override public void draw(Canvas canvas, Paint paint) { canvas.drawColor(Color.parseColor(mColor)); switch (mState) { case STATE_ANIM_NONE: drawNormalView(paint, canvas); break; case STATE_ANIM_START: drawStartAnimView(paint, canvas); break; case STATE_ANIM_STOP: // drawNormalView(paint, canvas); drawStopAnimView(paint, canvas); break; } } private void drawStopAnimView(Paint paint, Canvas canvas) { } private void drawStartAnimView(Paint paint, Canvas canvas) { canvas.save(); //0~1 if (mpro

更多Android技术分享可以关注@我,也可以加入QQ群号:1078469822,学习交流Android开发技能。

作者:冬日毛毛雨链接:https://juejin.cn/post/7012529789135224840来源:掘金著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

      专题文章
        CopyRight 2018-2019 实验室设备网 版权所有